home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d12 / asm_msc1.arc / EX41.ASM < prev    next >
Assembly Source File  |  1988-11-20  |  2KB  |  66 lines

  1. TITLE  32-Bit x 32-Bit Unsigned Multiply  (EX41.ASM)
  2.           PAGE      ,132
  3. EX41_DATA  SEGMENT   PARA 'DATA'
  4. HI_MCND   DW    ?
  5. LO_MCND   DW    ?
  6. HI_PP1    DW    ?
  7. LO_PP1    DW    ?
  8. HI_PP2    DW    ?
  9. LO_PP2    DW    ?
  10. HI_PP3    DW    ?
  11. LO_PP3    DW    ?
  12. HI_PP4    DW    ?
  13. LO_PP4    DW    ?
  14. EX41_DATA  ENDS
  15. EX41_CODE  SEGMENT   PARA 'CODE'
  16.       PUBLIC    MULU32
  17. MULU32    PROC      FAR
  18.           ASSUME    CS:EX41_CODE,DS:EX41_DATA
  19. ;
  20. ;  Initialize the data segment address.
  21. ;
  22.           PUSH      DS               ;Save caller's DS and Di
  23.       PUSH        DI
  24.           MOV       DI,EX41_DATA      ;Initialize DS
  25.           MOV       DS,DI            
  26. ;
  27. ;  The main program follows.
  28. ;
  29.           MOV       HI_MCND,DX       ;Save multiplicand in memory
  30.       MOV       LO_MCND,AX       
  31.       MUL        BX             ;Form partial product #1
  32.       MOV       HI_PP1,DX        ; and save it in memory
  33.       MOV       LO_PP1,AX
  34.       MOV        AX,HI_MCND       ;Form partial product #2
  35.       MUL        BX
  36.       MOV        HI_PP2,DX         ; and save it in memory
  37.       MOV        LO_PP2,AX
  38.       MOV        AX,LO_MCND         ;Form partial product #3
  39.       MUL        CX
  40.       MOV       HI_PP3,DX         ; and save it in memory
  41.       MOV        LO_PP3,AX
  42.       MOV        AX,HI_MCND         ;Form partial product #4
  43.       MUL        CX
  44.       MOV       HI_PP4,DX         ; and save it in memory
  45.       MOV        LO_PP4,AX
  46. ;
  47. ;  Add the partial products to form the final 64-bit product.
  48. ;
  49.       MOV        AX,LO_PP1         ;Low 16 bits
  50.       MOV        BX,HI_PP1         ;Form mid-lower 16 bits
  51.       ADD        BX,LO_PP2         ; with sum #1
  52.           ADC       HI_PP2,0
  53.           ADD       BX,LO_PP3        ; and sum #2
  54.       MOV        CX,HI_PP2         ;Form mid-upper 16 bits
  55.       ADC        CX,HI_PP3         ; with sum #3
  56.           ADC       HI_PP4,0
  57.           ADD       CX,LO_PP4        ; and sum #4
  58.       MOV        DX,HI_PP4         ;Form high 16 bits
  59.       ADC        DX,0         ; including propagated carry
  60.       POP        DI             ;Restore caller's registers
  61.       POP        DS
  62.           RET
  63. MULU32    ENDP
  64. EX41_CODE  ENDS
  65.          END       MULU32
  66.